//
// Created by 28365 on 2025/3/4.
//

#ifndef ODUPDATERSDK_IUPDATEHANDLER_H
#define ODUPDATERSDK_IUPDATEHANDLER_H

class IUpdateHandler;

#include "../include/config/handler/event/UpdateStartEvent.h"
#include "../include/config/handler/event/PreUpdateEvent.h"
#include "../include/config/handler/event/UpdatingEvent.h"
#include "../include/config/handler/event/PostUpdateEvent.h"
#include "../include/config/handler/event/UpdateErrorEvent.h"
#include "../include/config/handler/event/UpdateCompleteEvent.h"
#include "../include/ODUpdater.h"

class IUpdateHandler {
public:

    /**
     * 更新启动时调用，每次开启更新仅调用一次
     * @param event 存储需要更新的所有资源数据，以及版本
     * @param odUpdater 更新器对象，便于获取更新器配置信息
     */
    virtual void updateStart(UpdateStartEvent &event,const ODUpdater *odUpdater) = 0;

    /**
     * 每个版本更新开始时调用
     * @param version 当前更新的版本
     */
    virtual void updateStartVersion(int version) = 0;

    /**
     * 资源预更新
     * <p>每个资源更新前调用</p>
     * <p>可在此方法内拦截当前资源并忽略其更新</p>
     * @param event 存储当前资源相关的信息，通过调用setCancel()进行更新拦截
     */
    virtual void preUpdate(PreUpdateEvent &event) = 0;

    /**
     * 资源更新时
     * <p>该函数在当前"非删除类型"资源发送请求后(或"删除类型"资源获取文件信息后)，文件数据传输前(或文件删除前)调用</p>
     * <p>该事件无法进行取消操作</p>
     * @param event 存储文件大小，文件的传输流(不建议在此处直接操作数据流！)
     */
    virtual void update(const UpdatingEvent &event) = 0;

    /**
     * 资源更新后
     * @param event 更新后事件参数传递
     */
    virtual void postUpdate(const PostUpdateEvent &event) = 0;

    /**
     * 更新出错调用
     * @param event 存储更新错误和资源信息
     */
    virtual void updateError(const UpdateErrorEvent &event) = 0;

    /**
     * 每个版本更新完成且没有错误的情况下调用
     * @param version 当前更新完成的版本号
     */
    virtual void updateDoneVersion(int version) = 0;

    /**
     * 所有内容更新完成时调用,更新完成后仅调用一次
     * @param event 更新情况数据
     */
    virtual void allUpdateComplete(const UpdateCompleteEvent &event) = 0;

    virtual ~IUpdateHandler() = default;
};


#endif //ODUPDATERSDK_IUPDATEHANDLER_H
